package fr.utt.millebornes.cartes;
import fr.utt.millebornes.exception.AvancementImpossibleAttaqueException;
import fr.utt.millebornes.exception.AvancementImpossibleEtape200Exception;
import fr.utt.millebornes.exception.AvancementImpossibleFeuVertException;
import fr.utt.millebornes.exception.AvancementImpossibleKilometresException;
import fr.utt.millebornes.exception.AvancementImpossibleRalentissementException;
import fr.utt.millebornes.exception.BotteException;
import fr.utt.millebornes.exception.CibleIncorrecteException;
import fr.utt.millebornes.exception.CibleSuicideException;
import fr.utt.millebornes.exception.CoupFourreException;
import fr.utt.millebornes.exception.DejaAttaqueException;
import fr.utt.millebornes.exception.DejaRalentiException;
import fr.utt.millebornes.exception.ImmuniseException;
import fr.utt.millebornes.exception.JoueurDebutantNonAttaquableException;
import fr.utt.millebornes.exception.MauvaiseParadeException;
import fr.utt.millebornes.exception.NonAttaqueException;
import fr.utt.millebornes.exception.NonRalentiException;
import fr.utt.millebornes.joueur.Joueur;


public abstract class Attaque extends Carte {
	
	public Attaque() {
		pileDestination = Joueur.PILE_BATAILLE;
	}
	
	public boolean isCarteAttaque() {
		return true;
	}
	
	public boolean peutEtrePosee(Joueur jcible) throws DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException  {
		if (!jcible.estPasAttaque())
			throw new DejaAttaqueException();
		if (jcible.estImmunise(this))
			throw new ImmuniseException();
		if (!jcible.aPoseUneCarteFeuVert())
			throw new JoueurDebutantNonAttaquableException();
		return true;
		//return jcible.estAttaquable() && !jcible.estImmunise(this) && jcible.aPoseUneCarteFeuVert();
	}
	public boolean jouer(Joueur jsource, Joueur jcible) throws CibleSuicideException, CoupFourreException, DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException, AvancementImpossibleRalentissementException, AvancementImpossibleEtape200Exception, NonAttaqueException, MauvaiseParadeException, NonRalentiException, AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, BotteException, CibleIncorrecteException   {
		if (jsource.equals(jcible))
			throw new CibleSuicideException();
		return super.jouer(jsource,jcible);
	}
	
	protected void effetDeJeu(Joueur jsource,Joueur jcible) throws CoupFourreException {
		if (jcible.peutEffectuerCoupFourre())
			throw new CoupFourreException(jcible);
	}
	
}
